package com.ljx.threadTest.threadEnum;


import java.io.Serializable;

/**
 * @author 李加喜
 * @Package com.ljx.threadTest.config
 * @date 2024-05-29 10:45
 */
public interface BaseErrorCode extends Serializable {


    /**
     * 应用编码，默认为0，可以通过设置环境变量 app.global.int.code指定默认值
     *
     * @return 应用编码
     * @see Init#DEFAULT_APP_CODE
     * @see Init#APP_CODE_NAME
     */
    default int getApp() {
        return Init.DEFAULT_APP_CODE;
    }

    /**
     * 模块编码，默认为0，可以通过设置环境变量 module.global.int.code指定默认值
     *
     * @return 模块编码
     * @see Init#DEFAULT_MODULE_CODE
     * @see Init#MODULE_CODE_NAME
     */
    default int getModule() {
        return Init.DEFAULT_MODULE_CODE;
    }


    /**
     * 真实的错误码：应用编码+模块编码+错误码
     *
     * @return 真实的错误码
     */
    default int getRealCode() {
        int rc = getCode();
        if (getRealModule() > 0) {
            rc += getRealApp();
        }
        if (getRealModule() > 0) {
            rc += getRealModule();
        }
        return rc;
    }

    /**
     * 真实的应用编码
     *
     * @return 真实的应用编码
     */
    default int getRealApp() {
        return getRealApp(getApp());
    }

    /**
     * 真实的模块编码
     *
     * @return 真实的模块编码
     */
    default int getRealModule() {
        return getRealModule(getModule());
    }

    default int getRealApp(int app) {
        if (app > 0) {
            return app;
        }
        return Init.DEFAULT_APP_CODE;
    }

    default int getRealModule(int module) {
        if (module > 0) {
            return module;
        }
        return Init.DEFAULT_MODULE_CODE;
    }

    /**
     * 检查 应用编码、模块编码、错误码的合法性：
     * <li>1. 如果应用编码 大于0 ，则必须满足：应用编码的位数 大于 错误码的位数</li>
     * <li>2. 如果模块编码 大于0 ，则必须满足：模块编码的位数 大于 错误码的位数</li>
     * <li>2. 如果应用编码和模块编码 都大于0 ，则必须满足：应用编码的位数 大于 模块码的位数</li>
     */
    default void check() {
        ErrorCode.check(getRealApp(), getRealModule(), getCode());
    }

    /**
     * 错误码
     *
     * @return
     */
    int getCode();

    /**
     * 错误信息
     *
     * @return
     */
    String getName();
}
